/**
 * @file profile_struct.h
 * @author Linquan  
 * @brief  对外部传入的信息 创建配置表使用的。
 * @version 1.0
 * @date 2024-08-09
 * 
 * @copyright Copyright (c) 2024
 * 
 * @note 配置文件的数据结构 ：回路节点配置、联动公式、从设备参数配置
 * 
 */
#ifndef     PROFILE_STRUCT_H
#define     PROFILE_STRUCT_H

/*===========================[Includes]======================================*/
#include "stdint.h"





/*===========================[Defines]=======================================*/

#define CFG_PARA_MAX    8       /**> 配置参数最大数量 */
#define PARA_1  0
#define PARA_2  1
#define PARA_3  2


/*===========================[Macros]========================================*/
/*===========================[Typedef]=======================================*/



/**
 * @brief 节点配置地址
 * 
 */
typedef struct {

    uint32_t  circuit_ID;            /* 回路ID */
    uint32_t  circuit_node_index;   /* 回路节点索引号 */ 
       
}config_node_addr_t;





/******************************************
 * 回路配置：表头、节点信息
 * ***************************************/

/**
 * @brief 回路信息表头
 * 
 */
typedef struct {
    uint32_t        circuit_ID;           /* 回路ID  */ 
    uint32_t        circuit_node_num;    /* 回路包含的节点数量*/
}cfg_circuit_overview_t;



/**
 * @brief 一个节点的从配置文件中解析出的配置信息
 * 
 */
typedef struct 
{
    config_node_addr_t          dev_addr;            /** 节点地址 */      
  
    uint32_t                    node_type;           /** 节点类型：控制器为、探测器、灭火器、防护区等 */
    
    char*                       dev_description;     /**> 设备描述 */
    
    char*                       config_para[CFG_PARA_MAX];        /**> 配置参数 以字符串存储 */

}cfg_node_info_t;




/**************************************************
 *  联动公式： 信息源（防护区） - 联动条件 - 联动控制
 * ***********************************************/

/**
 * @brief 联动的判断条件
 * 
 */
typedef struct 
{
    uint32_t    alarm_type;            /** 报警种类：二三四级、高低报、手报按下等 */ 
    uint16_t    alarm_num;             /** 报警数量 */ 
}linkage_condition_t;


/**
 * @brief 启动的联动控制
 * 
 */
typedef struct 
{
    config_node_addr_t      link_node_addr;      /** 设备节点地址 */
    uint32_t                operate_type ;        /** 操作功能码*/  
}linkage_contral_t;


/**
 * @brief 联动公式，或者叫启动条件
 *  需要一个额外的联动公式的配置文件，配置联动公式
 * 
 *  有一个防护区的虚拟回路，其中每个节点都算一个防护区。
 *  每个防护区有自己的节点索引。这个防护区节点跟其他控制器主机一起被配置文件初始化。
 *  防护区的节点配置采用字符串解析的方式得到。解析出的节点地址使用链表管理。
 * 
 *  有一个函数来定期根据联动公式，遍历其中防护区的节点状态。
 *      遍历的过程中，满足判断条件的进行计数。
 *      遍历结束后，检查遍历后的满足判断条件的计数值和 联动公式中的判断条件数量是否大于等于。
 *      当大于等于，则输出联动节点。
 * 
 *  遍历联动公式中的联动节点
 *      找到联动节点的位置，调用其IO操作函数，传入操作码。进行联动。
 * 
 * 
 */
typedef struct 
{
    /* 防护区 */
    config_node_addr_t          zone_node;               /** 防护区节点地址  */ 
     
    /*  联动条件集合 */
    linkage_condition_t*        judgement_condition_ptr;    /** 判断条件指针 */ 
    uint16_t                    judgement_condition_num;    /** 判断条件数量 */  
    
    /* 输出节点 集合 */    
    linkage_contral_t*          linkage_ctr_ptr;             /** 联动控制指针 */
    uint16_t                    linkage_node_num;           /** 输出节点数量 */ 
    
} linkage_formula_t;



/**
 * @brief 联动公式管理
 * 
 */
typedef struct
{
    uint32_t                    active_condition_num;      /** 启动条件的数量 */ 
    linkage_formula_t*          condition_ptr;             /** 启动条件的指针，挂着一串联动公式 */ 

}link_ctr_manage_t;




/**************************************************
 *  主机下接参数配置
 * ***********************************************/


/**
 * @brief 配置下接参数时的 CAN报文结构
 * 
 */
typedef struct 
{
    uint32_t  fram_id;     // 帧ID
    uint8_t    data[8];    // 数据域

}fram_can_t;



/**
 * @brief 配置下接参数时的 serial报文结构
 * 
 */
typedef struct 
{
    uint8_t * data;        // 数据命令，得动态分配内存保存数据
    uint8_t    len;        // 数据长度

}fram_serial_t;




/**
 * @brief 主机下接参数数据格式
 * 
 */
typedef struct
{
    config_node_addr_t  dev_addr; // 节点地址中包含了 回路ID和设备ID。可以确定是用哪种通讯方式发送。
     
     union
     {
        /* CAN 报文 */
        fram_can_t  can_fram;

        /* 485报文 */
        fram_serial_t serial_fram;
    };
}slave_dev_para_conf_t;


/*===========================[Global Prototypes]=============================*/







#endif